//用verilog描述一个简单的微处理器，该处理器根据输入的指令，能实现四种操作，分别为两数相加，两数相减，操作数加1，操作数jian1.操作码和操作数均从指令中提取。
//制作者：FPGA研究者
//时间：2022年6月20日

/*
module mpc(instr,out);
  input [17:0] instr; //输入指令
  output reg [8:0] out;//输出结果
  reg func;
  reg [7:0] op1,op2;
  
 function [16:0] code_add;
 input [17:0] instr;
 reg add_func;
 reg [7:0] code,opr1,opr2;
 begin
 code=instr[17:16];//输入指令的instr的高两位是操作码；
 opr1=instr[7:0];//输入指令的低8位是操作数Opr1
 case(code)
  2'b00:begin   add_func=1;
               opr2=instr[15:8];end //从instr取第二个操作数
  2'b01:begin add_func=0;
               opr2=instr[15:8];end  
					
  2'b10:begin add_func=1;
               opr2=8'd1;end  //实现加1；
  default:begin add_func=0;
               opr2=8'd1;end  //实现减1；
   endcase
   code_add={add_func,opr2,opr1};
 end
endfunction

always@(instr) begin
{func,op2,op1}=code_add(instr);//调用函数
 if(func==1) begin
  out=op1+op2;//两数相加；操作数1加1操作
  end
 else 
   out=op1-op2;//两数相减；操作数1减1操作
 end
endmodule
*/

module mpc(clk,rst_n,ain,out,op);
   input clk,rst_n;
	input [16:0] ain;
	output reg [7:0] out;
	output reg[3:0] op;
always@(posedge clk) begin
   if(!rst_n) begin
	 out<=8'b0;
	 op<=4'b0;
	 end
	else 
	case(ain[16])
	  2'b0:begin out<=ain[7:0]+ain[15:8];op<=op+1'b1;end//实现两数相加操作，操作数加1
	  2'b1:begin out<=ain[7:0]-ain[15:8];op<=op-1'b1;end//实现两数相减操作，操作数减1
	endcase
	end
endmodule
					
 